﻿using System;
using System.Collections.Generic;

namespace Teal.Compiler {

    #region 节点

    /// <summary>
    /// 表示一个语法树节点。
    /// </summary>
    public abstract partial class Node {

        /// <summary>
        /// 生成当前节点的代码。
        /// </summary>
        public virtual void emit(CCodeGenContext context) {
            context.write(ToString());
        }

    }

    /// <summary>
    /// 表示一个变量。
    /// </summary>
    public partial class Variable : Node {

        /// <summary>
        /// 生成当前节点的代码。
        /// </summary>
        public override void emit(CCodeGenContext context) {
            context.write(resolvedType);
            context.write(' ');
            context.write(name.value);
            context.writeLine(';');
            if (initialiser != null) {
                context.write(name.value);
                context.write(" = ");
                initialiser.emit(context);
                context.writeLine(';');
            }
        }

    }

    /// <summary>
    /// 表示一个函数参数。
    /// </summary>
    public partial class Parameter : Variable {

    }

    #endregion

    #region 表达式

    #region Expression

    /// <summary>
    /// 表示一个表达式。
    /// </summary>
    public abstract partial class Expression : Node {

        /// <summary>
        /// 表示一个空表达式。主要用于错误表达式的占位符。
        /// </summary>
        private partial class EmptyExpression {

            /// <summary>
            /// 生成当前节点的代码。
            /// </summary>
            public override void emit(CCodeGenContext context) {
                base.emit(context);
            }

        }

    }

    #endregion

    #region Identfiers

    /// <summary>
    /// 表示一个标识符。
    /// </summary>
    public partial class Identifier {

        /// <summary>
        /// 生成当前节点的代码。
        /// </summary>
        public override void emit(CCodeGenContext context) {
            context.write(value);
        }

    }

    /// <summary>
    /// 表示一个魔法变量。
    /// </summary>
    public partial class MagicVariable : Identifier {

        /// <summary>
        /// 生成当前节点的代码。
        /// </summary>
        public override void emit(CCodeGenContext context) {
            base.emit(context);
        }

    }

    #endregion

    #region Literals

    /// <summary>
    /// 表示一个正则表达式常量。
    /// </summary>
    public partial class RegexLiteral : StringLiteral {

        /// <summary>
        /// 生成当前节点的代码。
        /// </summary>
        public override void emit(CCodeGenContext context) {
            base.emit(context);
        }

    }

    /// <summary>
    /// 表示一个列表表达式。
    /// </summary>
    public partial class ListLiteral {

        /// <summary>
        /// 生成当前节点的代码。
        /// </summary>
        public override void emit(CCodeGenContext context) {
            base.emit(context);
        }

    }

    /// <summary>
    /// 表示一个对象常量。
    /// </summary>
    public partial class DictLiteral {

        /// <summary>
        /// 生成当前节点的代码。
        /// </summary>
        public override void emit(CCodeGenContext context) {
            base.emit(context);
        }

    }

    /// <summary>
    /// 表示一个区间表达式。
    /// </summary>
    public partial class RangeLiteral {

        /// <summary>
        /// 生成当前节点的代码。
        /// </summary>
        public override void emit(CCodeGenContext context) {
            base.emit(context);
        }

    }

    /// <summary>
    /// 表示 this 常量。
    /// </summary>
    public partial class ThisLiteral {

        /// <summary>
        /// 生成当前节点的代码。
        /// </summary>
        public override void emit(CCodeGenContext context) {
            base.emit(context);
        }

    }

    /// <summary>
    /// 表示 base 常量。
    /// </summary>
    public partial class BaseLiteral {

        /// <summary>
        /// 生成当前节点的代码。
        /// </summary>
        public override void emit(CCodeGenContext context) {
            base.emit(context);
        }

    }

    /// <summary>
    /// 表示一个函数表达式。
    /// </summary>
    public partial class LambdaLiteral {

        /// <summary>
        /// 生成当前节点的代码。
        /// </summary>
        public override void emit(CCodeGenContext context) {
            base.emit(context);
        }


        internal Expression resolve(ResolveContext context, TypeReference to) {
            throw new NotImplementedException();
        }
    }

    #endregion

    #region ShimExpressions

    /// <summary>
    /// 表示一个括号表达式。
    /// </summary>
    public partial class ParenthesizedExpression {

        /// <summary>
        /// 生成当前节点的代码。
        /// </summary>
        public override void emit(CCodeGenContext context) {
            context.write('(');
            body.emit(context);
            context.write(')');
        }

    }

    /// <summary>
    /// 表示一个三元条件表达式。
    /// </summary>
    public partial class ConditionalExpression {

        /// <summary>
        /// 生成当前节点的代码。
        /// </summary>
        public override void emit(CCodeGenContext context) {
            condition.emit(context);
            context.write(" ? ");
            thenExpression.emit(context);
            context.write(" : ");
            elseExpression.emit(context);
        }

    }

    /// <summary>
    /// 表示一个类型转换表达式。
    /// </summary>
    public partial class CastExpression {

        /// <summary>
        /// 生成当前节点的代码。
        /// </summary>
        public override void emit(CCodeGenContext context) {
            context.write('(');
            targetType.emit(context);
            context.write(')');
            body.emit(context);
        }

    }

    #endregion

    #region CallExpression

    /// <summary>
    /// 表示一个成员调用表达式。
    /// </summary>
    public partial class MemberCallExpression {

        /// <summary>
        /// 生成当前节点的代码。
        /// </summary>
        public override void emit(CCodeGenContext context) {
            // todo
            target.emit(context);
            context.write('(');
            context.write(')');
        }

    }

    /// <summary>
    /// 表示一个函数调用表达式。
    /// </summary>
    public partial class FuncCallExpression {

        /// <summary>
        /// 生成当前节点的代码。
        /// </summary>
        public override void emit(CCodeGenContext context) {
            target.emit(context);
            context.write('(');
            emitArguments(context);
            context.write(')');
        }

        /// <summary>
        /// 写入参数。
        /// </summary>
        /// <param name="writer">写入的目标对象。</param>
        protected void emitArguments(CCodeGenContext context) {
            for (Argument argument = arguments; argument != null; argument = argument.next) {
                argument.emit(context);
                if (argument.next != null) {
                    context.write(", ");
                }
            }
        }

    }

    /// <summary>
    /// 表示一个 new 表达式。
    /// </summary>
    public partial class NewExpression : FuncCallExpression {

        /// <summary>
        /// 生成当前节点的代码。
        /// </summary>
        public override void emit(CCodeGenContext context) {
            base.emit(context);
        }

    }

    /// <summary>
    /// 表示一个索引调用表达式。
    /// </summary>
    public partial class IndexCallExpression : FuncCallExpression {

        /// <summary>
        /// 生成当前节点的代码。
        /// </summary>
        public override void emit(CCodeGenContext context) {
            base.emit(context);
        }

    }

    /// <summary>
    /// 表示一个链式成员访问表达式。
    /// </summary>
    public partial class ChainCallExpression {

        /// <summary>
        /// 生成当前节点的代码。
        /// </summary>
        public override void emit(CCodeGenContext context) {
            base.emit(context);
        }

    }

    #endregion

    #region ArithmeticExpression

    /// <summary>
    /// 表示一个一元运算表达式。
    /// </summary>
    public partial class UnaryExpression {

        /// <summary>
        /// 生成当前节点的代码。
        /// </summary>
        public override void emit(CCodeGenContext context) {
            base.emit(context);
        }

    }

    /// <summary>
    /// 表示一个 ++ 或 -- 运算表达式。
    /// </summary>
    public partial class MutatorExpression : UnaryExpression {

        /// <summary>
        /// 生成当前节点的代码。
        /// </summary>
        public override void emit(CCodeGenContext context) {
            if (prefix) {
                operand.emit(context);
                context.write(@operator.getName());
            } else {
                context.write(@operator.getName());
                operand.emit(context);
            }
        }

    }

    /// <summary>
    /// 表示一个二元运算表达式。
    /// </summary>
    public partial class BinaryExpression {

        /// <summary>
        /// 生成当前节点的代码。
        /// </summary>
        public override void emit(CCodeGenContext context) {
            base.emit(context);
        }

    }

    #endregion

    #endregion

    #region 语句

    #region Statement

    /// <summary>
    /// 表示一个语句。
    /// </summary>
    public abstract partial class Statement : Node {

        /// <summary>
        /// 生成当前节点的代码。
        /// </summary>
        public override void emit(CCodeGenContext context) {
            base.emit(context);
        }

    }

    /// <summary>
    /// 表示一个空语句。
    /// </summary>
    public partial class Semicolon {

        /// <summary>
        /// 生成当前节点的代码。
        /// </summary>
        public override void emit(CCodeGenContext context) {
            base.emit(context);
        }

    }

    #endregion

    #region Blocks

    /// <summary>
    /// 表示一个语句块。
    /// </summary>
    public partial class Block {

        /// <summary>
        /// 生成当前节点的代码。
        /// </summary>
        public override void emit(CCodeGenContext context) {
            if (statements == null) {
                return;
            }

            context.writeLine('{');
            context.indent++;
            emitStatements(context);
            context.indent--;
            context.writeLine();
            context.writeLine('}');
        }

        protected void emitStatements(CCodeGenContext context) {
            foreach (var statement in statements) {
                statement.emit(context);
            }
        }

    }

    /// <summary>
    /// 表示一个最顶层的语句块。
    /// </summary>
    public partial class ToplevelBlock : Block {

        /// <summary>
        /// 生成当前节点的代码。
        /// </summary>
        public override void emit(CCodeGenContext context) {
            context.writeLine('{');
            if (statements != null) {
                context.indent++;
                emitStatements(context);
                context.indent--;
            }
            context.writeLine('}');
        }

    }

    #endregion

    #region ShimStatements

    /// <summary>
    /// 表示一个变量声明语句。
    /// </summary>
    public partial class VariableStatement {

        /// <summary>
        /// 生成当前节点的代码。
        /// </summary>
        public override void emit(CCodeGenContext context) {
            for (var variable = variables; variable != null; variable = variable.next) {
                variable.emit(context);
            }
        }

    }

    /// <summary>
    /// 表示一个标签语句。
    /// </summary>
    public partial class LabeledStatement {

        /// <summary>
        /// 生成当前节点的代码。
        /// </summary>
        public override void emit(CCodeGenContext context) {
            base.emit(context);
        }

    }

    /// <summary>
    /// 表示一个表达式语句。
    /// </summary>
    public partial class ExpressionStatement {

        /// <summary>
        /// 生成当前节点的代码。
        /// </summary>
        public override void emit(CCodeGenContext context) {
            base.emit(context);
        }

    }

    /// <summary>
    /// 表示一组逗号隔开的表达式。
    /// </summary>
    public partial class CommaExpression {

        /// <summary>
        /// 生成当前节点的代码。
        /// </summary>
        public override void emit(CCodeGenContext context) {
            base.emit(context);
        }

    }

    ///// <summary>
    ///// 表示一个 runonce 语句。
    ///// </summary>
    //public partial class RunonceStatement {

    //    /// <summary>
    //    /// 生成当前节点的代码。
    //    /// </summary>
    //    public override void emit(CCodeGenContext context) {
    //        base.emit(context);
    //    }

    //}

    ///// <summary>
    ///// 表示一个 checked 语句。
    ///// </summary>
    //public partial class CheckedStatement {

    //    /// <summary>
    //    /// 生成当前节点的代码。
    //    /// </summary>
    //    public override void emit(CCodeGenContext context) {
    //        base.emit(context);
    //    }

    //}

    ///// <summary>
    ///// 表示一个 unchecked 语句。
    ///// </summary>
    //public partial class UncheckedStatement {

    //    /// <summary>
    //    /// 生成当前节点的代码。
    //    /// </summary>
    //    public override void emit(CCodeGenContext context) {
    //        base.emit(context);
    //    }

    //}

    /// <summary>
    /// 表示一个可调试语句。
    /// </summary>
    public partial class WithStatement {

        /// <summary>
        /// 生成当前节点的代码。
        /// </summary>
        public override void emit(CCodeGenContext context) {
            base.emit(context);
        }

    }

    #endregion

    #region SelectionStatements

    /// <summary>
    /// 表示一个 if 语句。
    /// </summary>
    public partial class IfStatement {

        /// <summary>
        /// 生成当前节点的代码。
        /// </summary>
        public override void emit(CCodeGenContext context) {
            context.write("if (");
            condition.emit(context);
            context.write(")");
            thenClause.emit(context);

            if (elseClause != null) {
                context.write(" else ");
                elseClause.emit(context);
            }

        }

    }

    /// <summary>
    /// 表示一个 switch 语句。
    /// </summary>
    public partial class SwitchStatement {

        /// <summary>
        /// 表示一个 case 段。
        /// </summary>
        public partial class CaseClause : Node {

            /// <summary>
            /// 生成当前节点的代码。
            /// </summary>
            public override void emit(CCodeGenContext context) {
                base.emit(context);
            }

        }

        /// <summary>
        /// 生成当前节点的代码。
        /// </summary>
        public override void emit(CCodeGenContext context) {
            base.emit(context);
        }

    }

    #endregion

    #region IterationStatements

    ///// <summary>
    ///// 表示一个 loop 语句。
    ///// </summary>
    //public partial class LoopStatement {

    //    /// <summary>
    //    /// 生成当前节点的代码。
    //    /// </summary>
    //    public override void emit(CCodeGenContext context) {
    //        base.emit(context);
    //    }

    //}

    /// <summary>
    /// 表示一个 for 语句。
    /// </summary>
    public partial class ForStatement {

        /// <summary>
        /// 生成当前节点的代码。
        /// </summary>
        public override void emit(CCodeGenContext context) {
            context.write("for (");

            if (initializer != null) {
                initializer.emit(context);
            }
            context.write(';');
            if (condition != null) {
                condition.emit(context);
            }
            context.write(';');
            if (iterator != null) {
                iterator.emit(context);
            }

            context.write(')');
            body.emit(context);
        }

    }

    /// <summary>
    /// 表示一个 for in 语句。
    /// </summary>
    public partial class ForInStatement {

        /// <summary>
        /// 生成当前节点的代码。
        /// </summary>
        public override void emit(CCodeGenContext context) {
            base.emit(context);
        }

    }

    /// <summary>
    /// 表示一个 for to 语句。
    /// </summary>
    public partial class ForToStatement {

        /// <summary>
        /// 生成当前节点的代码。
        /// </summary>
        public override void emit(CCodeGenContext context) {
            base.emit(context);
        }

    }

    /// <summary>
    /// 表示一个 while 语句。
    /// </summary>
    public partial class WhileStatement {

        /// <summary>
        /// 生成当前节点的代码。
        /// </summary>
        public override void emit(CCodeGenContext context) {
            base.emit(context);
        }

    }

    ///// <summary>
    ///// 表示一个 until 语句。
    ///// </summary>
    //public partial class UntilStatement {

    //    /// <summary>
    //    /// 生成当前节点的代码。
    //    /// </summary>
    //    public override void emit(CCodeGenContext context) {
    //        base.emit(context);
    //    }

    //}

    /// <summary>
    /// 表示一个 do while 语句。
    /// </summary>
    public partial class DoWhileStatement {

        /// <summary>
        /// 生成当前节点的代码。
        /// </summary>
        public override void emit(CCodeGenContext context) {
            base.emit(context);
        }

    }

    ///// <summary>
    ///// 表示一个 do until 语句。
    ///// </summary>
    //public partial class DoUntilStatement : DoWhileStatement {

    //    /// <summary>
    //    /// 生成当前节点的代码。
    //    /// </summary>
    //    public override void emit(CCodeGenContext context) {
    //        base.emit(context);
    //    }

    //}

    #endregion

    #region JumpStatements

    /// <summary>
    /// 表示一个 continue 语句。
    /// </summary>
    public partial class ContinueStatement {

        /// <summary>
        /// 生成当前节点的代码。
        /// </summary>
        public override void emit(CCodeGenContext context) {
            base.emit(context);
        }

    }

    /// <summary>
    /// 表示一个 break 语句。
    /// </summary>
    public partial class BreakStatement {

        /// <summary>
        /// 生成当前节点的代码。
        /// </summary>
        public override void emit(CCodeGenContext context) {
            base.emit(context);
        }

    }

    /// <summary>
    /// 表示一个 return 语句。
    /// </summary>
    public partial class ReturnStatement {

        /// <summary>
        /// 生成当前节点的代码。
        /// </summary>
        public override void emit(CCodeGenContext context) {
            context.write("return ");
            if (value != null) {
                value.emit(context);
            }
            context.writeLine(';');
        }

    }

    /// <summary>
    /// 表示一个跳转到标签的跳到语句。
    /// </summary>
    public partial class GotoLabelStatement {

        /// <summary>
        /// 生成当前节点的代码。
        /// </summary>
        public override void emit(CCodeGenContext context) {
            base.emit(context);
        }

    }

    /// <summary>
    /// 表示一个跳转到 case 语句的跳到语句。
    /// </summary>
    public partial class GotoCaseStatement {

        /// <summary>
        /// 生成当前节点的代码。
        /// </summary>
        public override void emit(CCodeGenContext context) {
            base.emit(context);
        }

    }

    /// <summary>
    /// 表示一个 yield 语句。
    /// </summary>
    public partial class YieldStatement {

        /// <summary>
        /// 生成当前节点的代码。
        /// </summary>
        public override void emit(CCodeGenContext context) {
            base.emit(context);
        }

    }

    #endregion

    #region ExceptionStatements

    /// <summary>
    /// 表示一个 try 语句。
    /// </summary>
    public partial class TryStatement {

        /// <summary>
        /// 生成当前节点的代码。
        /// </summary>
        public override void emit(CCodeGenContext context) {
            base.emit(context);
        }

    }

    /// <summary>
    /// 表示一个 throw 语句。
    /// </summary>
    public partial class ThrowStatement {

        /// <summary>
        /// 生成当前节点的代码。
        /// </summary>
        public override void emit(CCodeGenContext context) {
            base.emit(context);
        }

    }

    #endregion

    #endregion

    #region 成员定义

    #region MemberDefinition

    /// <summary>
    /// 表示一个成员（如方法、字段、类型、包等）定义。
    /// </summary>
    public abstract partial class MemberDefinition : Node {

        /// <summary>
        /// 生成当前节点的代码。
        /// </summary>
        public override void emit(CCodeGenContext context) {
            base.emit(context);
        }

    }

    /// <summary>
    /// 表示一个注解。
    /// </summary>
    public partial class MemberAnnotation : FuncCallExpression {

    }

    #endregion

    #region TypeMemberDefinitions

    /// <summary>
    /// 表示一个字段定义。
    /// </summary>
    public partial class FieldDefinition : MemberDefinition {

        /// <summary>
        /// 生成当前节点的代码。
        /// </summary>
        public override void emit(CCodeGenContext context) {
            base.emit(context);
        }

    }

    /// <summary>
    /// 表示一个属性定义。
    /// </summary>
    public partial class PropertyDefinition : MemberDefinition {

        /// <summary>
        /// 生成当前节点的代码。
        /// </summary>
        public override void emit(CCodeGenContext context) {
            base.emit(context);
        }

    }

    /// <summary>
    /// 表示一个索引器定义。
    /// </summary>
    public partial class IndexerDefinition : PropertyDefinition {

        /// <summary>
        /// 生成当前节点的代码。
        /// </summary>
        public override void emit(CCodeGenContext context) {
            base.emit(context);
        }

    }

    /// <summary>
    /// 表示一个方法定义。
    /// </summary>
    public partial class MethodDefinition : MemberDefinition {

        /// <summary>
        /// 生成当前节点的代码。
        /// </summary>
        public override void emit(CCodeGenContext context) {
            if (methodReference.modifiers.hasFlag(Modifiers.@extern)) {
                return;
            }
            context.write(methodReference.returnType);
            context.write(' ');
            context.write(methodReference.name);
            context.write('(');
            for (int i = 0; i < methodReference.parameters.Length; i++) {
                if (i > 0) {
                    context.write(',');
                    context.write(' ');
                }
                var p = methodReference.parameters[i];
                context.write(p.type);
                context.write(' ');
                context.write(p.name);
            }
            context.write(')');
            context.write(' ');

            if (body != null) {
                body.emit(context);
            } else {
                context.writeLine(';');
            }
        }

    }

    /// <summary>
    /// 表示一个构造函数定义。
    /// </summary>
    public partial class ConstructorDefinition : MethodDefinition {

        /// <summary>
        /// 生成当前节点的代码。
        /// </summary>
        public override void emit(CCodeGenContext context) {
            base.emit(context);
        }

    }

    /// <summary>
    /// 表示一个构造函数定义。
    /// </summary>
    public partial class DeconstructorDefinition : MethodDefinition {

        /// <summary>
        /// 生成当前节点的代码。
        /// </summary>
        public override void emit(CCodeGenContext context) {
            base.emit(context);
        }

    }

    /// <summary>
    /// 表示操作符重载定义。
    /// </summary>
    public partial class OperatorOverloadDefinition : MethodDefinition {

        /// <summary>
        /// 生成当前节点的代码。
        /// </summary>
        public override void emit(CCodeGenContext context) {
            base.emit(context);
        }

    }

    /// <summary>
    /// 表示一个枚举的成员定义。
    /// </summary>
    public partial class EnumFieldDefinition : MemberDefinition {

        /// <summary>
        /// 生成当前节点的代码。
        /// </summary>
        public override void emit(CCodeGenContext context) {
            base.emit(context);
        }

    }

    #endregion

    #region MemberContainerDefinition

    /// <summary>
    /// 表示一个可以包含子成员的容器成员定义。
    /// </summary>
    public abstract partial class MemberContainerDefinition : MemberDefinition {

        /// <summary>
        /// 生成当前节点的代码。
        /// </summary>
        public override void emit(CCodeGenContext context) {
            base.emit(context);
        }

    }

    /// <summary>
    /// 表示一个命名空间定义。
    /// </summary>
    public partial class NamespaceDefinition : MemberContainerDefinition {

        /// <summary>
        /// 生成当前节点的代码。
        /// </summary>
        public override void emit(CCodeGenContext context) {
            base.emit(context);
        }

    }

    /// <summary>
    /// 表示一个源编译单元。
    /// </summary>
    public partial class SourceUnit : MemberContainerDefinition {

        /// <summary>
        /// 生成当前节点的代码。
        /// </summary>
        public override void emit(CCodeGenContext context) {
            CCodeGenHelper.emitChildMembers(this, context);
        }

    }

    /// <summary>
    /// 表示一个包。
    /// </summary>
    public partial class Package : MemberContainerDefinition {

        /// <summary>
        /// 生成当前节点的代码。
        /// </summary>
        public override void emit(CCodeGenContext context) {
            context.writeLine("#include<stdio.h>");
            context.writeLine();

            CCodeGenHelper.emitChildMembers(this, context);
        }

    }

    /// <summary>
    /// 表示一个扩展定义。
    /// </summary>
    public partial class ExtensionDefinition : MemberContainerDefinition {

        /// <summary>
        /// 生成当前节点的代码。
        /// </summary>
        public override void emit(CCodeGenContext context) {
            base.emit(context);
        }

    }

    /// <summary>
    /// 表示一个枚举定义。
    /// </summary>
    public partial class EnumDefinition : MemberContainerDefinition {

        /// <summary>
        /// 生成当前节点的代码。
        /// </summary>
        public override void emit(CCodeGenContext context) {
            base.emit(context);
        }

    }

    #endregion

    #region TypeDefinitions

    /// <summary>
    /// 表示一个类型（如类、结构、接口）定义。
    /// </summary>
    public abstract partial class TypeDefinition : MemberContainerDefinition {

    }

    /// <summary>
    /// 表示一个类定义。
    /// </summary>
    public partial class ClassDefinition : TypeDefinition {

        /// <summary>
        /// 生成当前节点的代码。
        /// </summary>
        public override void emit(CCodeGenContext context) {
            base.emit(context);
        }

    }

    /// <summary>
    /// 表示一个结构定义。
    /// </summary>
    public partial class StructDefinition : TypeDefinition {

        /// <summary>
        /// 生成当前节点的代码。
        /// </summary>
        public override void emit(CCodeGenContext context) {
            base.emit(context);
        }

    }

    /// <summary>
    /// 表示一个接口定义。
    /// </summary>
    public partial class InterfaceDefinition : TypeDefinition {

        /// <summary>
        /// 生成当前节点的代码。
        /// </summary>
        public override void emit(CCodeGenContext context) {
            base.emit(context);
        }

    }

    #endregion

    #endregion

    #region Constants

    /// <summary>
    /// 表示一个常量。
    /// </summary>
    public abstract partial class Constant : ResolvedExpression {

    }

    /// <summary>
    /// 表示一个 32 位整数常量。
    /// </summary>
    public sealed partial class Int32Constant : Constant {

        /// <summary>
        /// 生成当前节点的代码。
        /// </summary>
        public override void emit(CCodeGenContext context) {
            context.write(_value.ToString());
        }

    }

    /// <summary>
    /// 表示一个字符串常量。
    /// </summary>
    public sealed partial class StringConstant : Constant {

        /// <summary>
        /// 生成当前节点的代码。
        /// </summary>
        public override void emit(CCodeGenContext context) {
            context.write(Utility.escapeString(_value));
        }


    }

    /// <summary>
    /// 表示一个字符串常量。
    /// </summary>
    public sealed partial class NullConstant : Constant {

        /// <summary>
        /// 生成当前节点的代码。
        /// </summary>
        public override void emit(CCodeGenContext context) {
            context.write("0");
        }

    }

    #endregion

    #region SymbolExpressions

    /// <summary>
    /// 表示一个存储表达式。
    /// </summary>
    public abstract partial class ResolvedStoreExpression : ResolvedExpression {

    }

    /// <summary>
    /// 表示一个变量求址表达式。
    /// </summary>
    public partial class ResolvedAddressOfThisExpression : ResolvedExpression {

        /// <summary>
        /// 生成当前节点的代码。
        /// </summary>
        public override void emit(CCodeGenContext context) {
            context.write("&");
            target.emit(context);
        }

    }

    #region 变量

    /// <summary>
    /// 表示一个变量载入表达式。
    /// </summary>
    public partial class ResolvedLoadVariableExpression : ResolvedExpression {

        /// <summary>
        /// 生成当前节点的代码。
        /// </summary>
        public override void emit(CCodeGenContext context) {
            context.write(target.name.value);
        }

    }

    /// <summary>
    /// 表示一个变量存储表达式。
    /// </summary>
    public partial class ResolvedStoreVariableExpression : ResolvedStoreExpression {

        /// <summary>
        /// 生成当前节点的代码。
        /// </summary>
        public override void emit(CCodeGenContext context) {
            context.write(target.name.value);
            context.write(" = ");
            value.emit(context);
        }

    }

    /// <summary>
    /// 表示一个变量求址表达式。
    /// </summary>
    public partial class ResolvedAddressOfVariableExpression : ResolvedExpression {

        /// <summary>
        /// 生成当前节点的代码。
        /// </summary>
        public override void emit(CCodeGenContext context) {
            context.write('&');
            context.write(target.name.value);
        }

    }

    #endregion

    #region 参数

    /// <summary>
    /// 表示一个参数载入表达式。
    /// </summary>
    public partial class ResolvedLoadParameterExpression : ResolvedExpression {

        /// <summary>
        /// 生成当前节点的代码。
        /// </summary>
        public override void emit(CCodeGenContext context) {
            context.write(target.name.value);
        }

    }

    /// <summary>
    /// 表示一个参数存储表达式。
    /// </summary>
    public partial class ResolvedStoreParameterExpression : ResolvedStoreExpression {

        /// <summary>
        /// 生成当前节点的代码。
        /// </summary>
        public override void emit(CCodeGenContext context) {
            context.write(target.name.value);
            context.write(" = ");
            value.emit(context);
        }

    }

    /// <summary>
    /// 表示一个参数求址表达式。
    /// </summary>
    public partial class ResolvedAddressOfParameterExpression : ResolvedExpression {

        /// <summary>
        /// 生成当前节点的代码。
        /// </summary>
        public override void emit(CCodeGenContext context) {
            context.write('&');
            context.write(target.name.value);
        }

    }

    #endregion

    #region 字段

    /// <summary>
    /// 表示一个字段载入表达式。
    /// </summary>
    public partial class ResolvedLoadFieldExpression : ResolvedExpression {

        /// <summary>
        /// 生成当前节点的代码。
        /// </summary>
        public override void emit(CCodeGenContext context) {
            context.write(target.fullName);
        }

    }

    /// <summary>
    /// 表示一个变量存储表达式。
    /// </summary>
    public partial class ResolvedStoreFieldExpression : ResolvedStoreExpression {

        /// <summary>
        /// 生成当前节点的代码。
        /// </summary>
        public override void emit(CCodeGenContext context) {
            context.write(target.fullName);
            context.write(" = ");
            value.emit(context);
        }

    }

    /// <summary>
    /// 表示一个变量求址表达式。
    /// </summary>
    public partial class ResolvedAddressOfFieldExpression : ResolvedExpression {

        /// <summary>
        /// 生成当前节点的代码。
        /// </summary>
        public override void emit(CCodeGenContext context) {
            context.write('&');
            context.write(target.fullName);
        }

    }

    #endregion

    #region 属性

    /// <summary>
    /// 表示一个属性载入表达式。
    /// </summary>
    public partial class ResolvedLoadPropertyExpression : ResolvedExpression {

        /// <summary>
        /// 生成当前节点的代码。
        /// </summary>
        public override void emit(CCodeGenContext context) {
            context.write(target.fullName);
        }

    }

    /// <summary>
    /// 表示一个变量存储表达式。
    /// </summary>
    public partial class ResolvedStorePropertyExpression : ResolvedStoreExpression {

        /// <summary>
        /// 生成当前节点的代码。
        /// </summary>
        public override void emit(CCodeGenContext context) {
            context.write(target.fullName);
            context.write(" = ");
            value.emit(context);
        }

    }

    #endregion

    #region 方法

    /// <summary>
    /// 表示一个方法引用调用表达式。
    /// </summary>
    /// <remarks>
    /// 不同于源码中的函数调用表达式(FuncCallExpression)，InvocationExpression 已经确定调用的目标方法和参数。并且不需要处理函数重载问题。
    /// </remarks>
    public partial class ResolvedMethodInvocationExpression : ResolvedExpression {

        /// <summary>
        /// 生成当前节点的代码。
        /// </summary>
        public override void emit(CCodeGenContext context) {
            base.emit(context);
        }

    }

    #endregion

    #endregion

}